#include <iostream>
#include <unistd.h>
#include <cerrno>
#include <string.h>
#include <sys/time.h>
#include <cassert>
#include "pollServer.hpp"
#include <poll.h>
#include <memory>
using namespace std;
// ################################################################################
// int poll(struct pollfd *fds, nfds_t nfds, int timeout);
// poll 只负责等
// fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返回的事件集合
//  用户告诉内核：你要帮我关注哪些fd，哪些事件。内核告诉用户，哪些fd哪些事件已经就绪了
// nfds表示fds数组的长度
// timeout表示poll函数的超时时间, 单位是毫秒(ms). 输入型参数。传入1000 表示1秒之后返回。 0： 表示非阻塞等待 -1： 表示阻塞等带
//          struct pollfd {
//                int   fd;         /* file descriptor */
//                short events;     /* requested events */
//                short revents;    /* returned events */
//            };
// ################################################################################
// poll 的优缺点
// poll的优点：
// 1.效率高
// 2.有大量的链接，但是只有少量是活跃的
// 3.输入输出参数是分离的，不需要进行大量的重置
// 4.poll的参数级别，没有可以管理的fd的上限
// poll的缺点
// poll依旧需要不少的遍历，在用户层检测事件就绪，与内核检测fd就绪都是一样的---用户需要维护数组
// poll需要内核到用户的拷贝---少不了的
// poll的代码也比较复杂--比select容易
// ################################################################################
//
void test()
{

    struct pollfd poll_fd;
    poll_fd.fd = 0;
    poll_fd.events = POLLIN;

    for (;;)
    {
        int ret = poll(&poll_fd, 1, 1000);
        if (ret < 0)
        {
            perror("poll");
            continue;
        }
        if (ret == 0)
        {
            printf("poll timeout\n");
            continue;
        }
        if (poll_fd.revents == POLLIN)
        {
            char buf[1024] = {0};
            read(0, buf, sizeof(buf) - 1);
            printf("stdin:%s", buf);
        }
    }
}
int main()
{
     std::unique_ptr<PollServer> ser(new PollServer());
     ser->Start();
    //test();
    return 0;
}